<?php 
function get_sysinfo(){
	error_reporting(0);
	$action = isset($_GET['act']) ? $_GET['act'] : '';
	if ($action == "phpinfo"){
		phpinfo();
		exit;
	}
	// 根据不同系统取得CPU相关信息
	switch(PHP_OS){
		case 'Darwin':
		case "Linux":
			$sysReShow = (false !== ($sysInfo = sys_linux())) ? "show" : "none";
			break;
		case "FreeBSD":
			$sysReShow = (false !== ($sysInfo = sys_freebsd())) ? "show" : "none";
			break;
		case "WINNT":
			$sysReShow = (false !== ($sysInfo = sys_windows())) ? "show" : "none";
			break;
		default: break;
	}
	$tmp = array('memTotal', 'memUsed', 'memFree', 'memPercent','memCached', 'memRealPercent','memCachedPercent','swapTotal', 'swapUsed', 'swapFree', 'swapPercent');
	foreach ($tmp as $v) $sysInfo[$v] = isset($sysInfo[$v]) ? $sysInfo[$v] : 0;
	$result=array();
	$result=$sysInfo;
	$result['sysReShow'] = $sysReShow;
	$result['stime'] = date("Y-n-j H:i:s");
	$result['freeSpace'] = round(@disk_free_space(".")/(1024*1024*1024),3);
	$result['DiskTotal'] = round(@disk_total_space(".")/(1024*1024*1024),3);	//总空间	
	//网卡流量
	$strs = @file("/proc/net/dev");
	$NetOut=array();
	for ($i = 2; $i < count($strs); $i++ ){
		preg_match_all( "/([^\s]+):[\s]{0,}(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/", $strs[$i], $info );
	/*	$NetInput[$i] = formatsize($info[2][0]);
		$NetOut[$i]  = formatsize($info[10][0]);
	*/ 
		$tmo = round($info[2][0]/1024/1024, 5); 
		$tmo2 = round($tmo / 1024, 5);
		$NetInput[$i] = $tmo2;
		$tmp = round($info[10][0]/1024/1024, 5); 
		$tmp2 = round($tmp / 1024, 5);
		$NetOut[$i] = $tmp2;
	}	
	//判断内存如果小于1GB，就显示M，否则显示GB单位
	if($sysInfo['memTotal']<1024){
		$result['TotalMemory'] 		= isset($sysInfo['memTotal']) ? $sysInfo['memTotal']." MB" : '0';
		$result['UsedMemory'] 		= isset($sysInfo['memUsed']) ? $sysInfo['memUsed']." MB" : '0';
		$result['FreeMemory'] 		= isset($sysInfo['memFree']) ? $sysInfo['memFree']." MB" : '0';
		$result['CachedMemory'] 	= isset($sysInfo['memCached']) ? $sysInfo['memCached']." MB" : '0';	//cache化内存
		$result['Buffers'] 			= isset($sysInfo['memBuffers']) ? $sysInfo['memBuffers']." MB" : '0';	//缓冲
		$result['TotalSwap'] 		= isset($sysInfo['swapTotal']) ? $sysInfo['swapTotal']." MB" : '0';
		$result['swapUsed'] 		= isset($sysInfo['swapUsed']) ? $sysInfo['swapUsed']." MB" : '0';
		$result['swapFree'] 		= isset($sysInfo['swapFree']) ? $sysInfo['swapFree']." MB" : '0';
		$result['swapPercent'] 		= isset($sysInfo['swapPercent']) ? $sysInfo['swapPercent']." MB" : '0';
		$result['memRealUsed'] 		= isset($sysInfo['memRealUsed']) ? $sysInfo['memRealUsed']." MB" : '0'; //真实内存使用
		$result['memRealFree'] 		= isset($sysInfo['memRealFree']) ? $sysInfo['memRealFree']." MB" : '0'; //真实内存空闲
		$result['memRealPercent']	= isset($sysInfo['memRealPercent']) ? $sysInfo['memRealPercent']." MB" : '0'; //真实内存使用比率
		$result['memPercent'] 		= isset($sysInfo['memPercent']) ? $sysInfo['memPercent']."%" : '0'; //内存总使用率
		$result['memCachedPercent'] = isset($sysInfo['memCachedPercent']) ? $sysInfo['memCachedPercent'] : '0'; //cache内存使用率
	}else{
		$result['TotalMemory'] 		= round($sysInfo['memTotal']/1024,3)." GB";
		$result['UsedMemory'] 		= round($sysInfo['memUsed']/1024,3)." GB";
		$result['FreeMemory'] 		= round($sysInfo['memFree']/1024,3)." GB";
		$result['CachedMemory'] 	= round($sysInfo['memCached']/1024,3)." GB";
		$result['Buffers'] 			= round($sysInfo['memBuffers']/1024,3)." GB";
		$result['TotalSwap'] 		= round($sysInfo['swapTotal']/1024,3)." GB";
		$result['swapUsed'] 		= round($sysInfo['swapUsed']/1024,3)." GB";
		$result['swapFree'] 		= round($sysInfo['swapFree']/1024,3)." GB";
		$result['swapPercent'] 		= $sysInfo['swapPercent'];
		$result['memRealUsed'] 		= round($sysInfo['memRealUsed']/1024,3)." GB"; //真实内存使用
		$result['memRealFree'] 		= round($sysInfo['memRealFree']/1024,3)." GB"; //真实内存空闲
		$result['memRealPercent'] 	= $sysInfo['memRealPercent']; //真实内存使用比率
		$result['memPercent'] 		= $sysInfo['memPercent'].'%'; //内存总使用率
		$result['memCachedPercent'] = $sysInfo['memCachedPercent']; //cache内存使用率
	}
	$result['barmemCachedPercent']	= $result['memCachedPercent'].'%';
	$result['barswapPercent']		= $result['swapPercent'].'%';
	$result['barmemRealPercent']	= $result['memRealPercent'].'%';	
	$result['NetOut2']				= isset($NetOut[2]) ? $NetOut[2] : '';
	$result['NetOut3']				= isset($NetOut[3]) ? $NetOut[3] : '';
	$result['NetOut4']				= isset($NetOut[4]) ? $NetOut[4] : '';
	$result['NetOut5']				= isset($NetOut[5]) ? $NetOut[5] : '';
	$result['NetOut6']				= isset($NetOut[6]) ? $NetOut[6] : '';
	$result['NetOut7']				= isset($NetOut[7]) ? $NetOut[7] : '';
	$result['NetOut8']				= isset($NetOut[8]) ? $NetOut[8] : '';
	$result['NetOut9']				= isset($NetOut[9]) ? $NetOut[9] : '';
	$result['NetOut10']				= isset($NetOut[10]) ? $NetOut[10] : '';
	$result['NetInput2']			= isset($NetInput[2]) ? $NetInput[2] : '';
	$result['NetInput3']			= isset($NetInput[3]) ? $NetInput[3] : '';
	$result['NetInput4']			= isset($NetInput[4]) ? $NetInput[4] : '';
	$result['NetInput5']			= isset($NetInput[5]) ? $NetInput[5] : '';
	$result['NetInput6']			= isset($NetInput[6]) ? $NetInput[6] : '';
	$result['NetInput7']			= isset($NetInput[7]) ? $NetInput[7] : '';
	$result['NetInput8']			= isset($NetInput[8]) ? $NetInput[8] : '';
	$result['NetInput9']			= isset($NetInput[9]) ? $NetInput[9] : '';
	$result['NetInput10']			= isset($NetInput[10]) ? $NetInput[10] : '';
	//ajax调用实时刷新
	if ($action == "rt"){
		$jarr=json_encode($result); 
		echo $_GET['callback'],'(',$jarr,')';
		exit;
	}
	return $result;
}


//linux系统探测
function sys_linux(){
    // CPU
    if (false === ($str = @file("/proc/cpuinfo"))) return false;
    $str = implode("", $str);
    @preg_match_all("/model\s+name\s{0,}\:+\s{0,}([\w\s\)\(\@.-]+)([\r\n]+)/s", $str, $model);
    @preg_match_all("/cpu\s+MHz\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $mhz);
    @preg_match_all("/cache\s+size\s{0,}\:+\s{0,}([\d\.]+\s{0,}[A-Z]+[\r\n]+)/", $str, $cache);
    @preg_match_all("/bogomips\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $bogomips);
    if (false !== is_array($model[1])){
        $res['cpu']['num'] = sizeof($model[1]);
		/*
        for($i = 0; $i < $res['cpu']['num']; $i++){
            $res['cpu']['model'][] = $model[1][$i].'&nbsp;('.$mhz[1][$i].')';
            $res['cpu']['mhz'][] = $mhz[1][$i];
            $res['cpu']['cache'][] = $cache[1][$i];
            $res['cpu']['bogomips'][] = $bogomips[1][$i];
        }*/
		if($res['cpu']['num']==1) $x1 = ''; else $x1 = ' ×'.$res['cpu']['num'];
		$mhz[1][0] = ' | 频率:'.$mhz[1][0];
		$cache[1][0] = ' | 二级缓存:'.$cache[1][0];
		$bogomips[1][0] = ' | Bogomips:'.$bogomips[1][0];
		$res['cpu']['model'][] = $model[1][0].$mhz[1][0].$cache[1][0].$bogomips[1][0].$x1;
        if (false !== is_array($res['cpu']['model'])) $res['cpu']['model'] = implode("<br />", $res['cpu']['model']);
        /* if (false !== is_array($res['cpu']['mhz'])) $res['cpu']['mhz'] = implode("<br />", $res['cpu']['mhz']);
        if (false !== is_array($res['cpu']['cache'])) $res['cpu']['cache'] = implode("<br />", $res['cpu']['cache']);
        if (false !== is_array($res['cpu']['bogomips'])) $res['cpu']['bogomips'] = implode("<br />", $res['cpu']['bogomips']); */
	}

    // NETWORK

    // UPTIME
    if (false === ($str = @file("/proc/uptime"))) return false;
    $str = explode(" ", implode("", $str));
    $str = trim($str[0]);
    $min = $str / 60;
    $hours = $min / 60;
    $days = floor($hours / 24);
    $hours = floor($hours - ($days * 24));
    $min = floor($min - ($days * 60 * 24) - ($hours * 60));
    if ($days !== 0) $res['uptime'] = $days."天";
    if ($hours !== 0) $res['uptime'] .= $hours."小时";
    $res['uptime'] .= $min."分钟";

    // MEMORY
    if (false === ($str = @file("/proc/meminfo"))) return false;
    $str = implode("", $str);
    preg_match_all("/MemTotal\s{0,}\:+\s{0,}([\d\.]+).+?MemFree\s{0,}\:+\s{0,}([\d\.]+).+?Cached\s{0,}\:+\s{0,}([\d\.]+).+?SwapTotal\s{0,}\:+\s{0,}([\d\.]+).+?SwapFree\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buf);
	preg_match_all("/Buffers\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buffers);
    $res['memTotal'] = round($buf[1][0]/1024, 2);
    $res['memFree'] = round($buf[2][0]/1024, 2);
    $res['memBuffers'] = round($buffers[1][0]/1024, 2);
	$res['memCached'] = round($buf[3][0]/1024, 2);
    $res['memUsed'] = $res['memTotal']-$res['memFree'];
    $res['memPercent'] = (floatval($res['memTotal'])!=0)?round($res['memUsed']/$res['memTotal']*100,2):0;
    $res['memRealUsed'] = $res['memTotal'] - $res['memFree'] - $res['memCached'] - $res['memBuffers']; //真实内存使用
	$res['memRealFree'] = $res['memTotal'] - $res['memRealUsed']; //真实空闲
    $res['memRealPercent'] = (floatval($res['memTotal'])!=0)?round($res['memRealUsed']/$res['memTotal']*100,2):0; //真实内存使用率
	$res['memCachedPercent'] = (floatval($res['memCached'])!=0)?round($res['memCached']/$res['memTotal']*100,2):0; //Cached内存使用率
    $res['swapTotal'] = round($buf[4][0]/1024, 2);
    $res['swapFree'] = round($buf[5][0]/1024, 2);
    $res['swapUsed'] = round($res['swapTotal']-$res['swapFree'], 2);
    $res['swapPercent'] = (floatval($res['swapTotal'])!=0)?round($res['swapUsed']/$res['swapTotal']*100,2):0;

    // LOAD AVG
    if (false === ($str = @file("/proc/loadavg"))) return false;
    $str = explode(" ", implode("", $str));
    $str = array_chunk($str, 4);
    $res['loadAvg'] = implode(" ", $str[0]);

    return $res;
}

//FreeBSD系统探测
function sys_freebsd(){
	//CPU
	if (false === ($res['cpu']['num'] = get_key("hw.ncpu"))) return false;
	$res['cpu']['model'] = get_key("hw.model");
	//LOAD AVG
	if (false === ($res['loadAvg'] = get_key("vm.loadavg"))) return false;
	//UPTIME
	if (false === ($buf = get_key("kern.boottime"))) return false;
	$buf = explode(' ', $buf);
	$sys_ticks = time() - intval($buf[3]);
	$min = $sys_ticks / 60;
	$hours = $min / 60;
	$days = floor($hours / 24);
	$hours = floor($hours - ($days * 24));
	$min = floor($min - ($days * 60 * 24) - ($hours * 60));
	if ($days !== 0) $res['uptime'] = $days."天";
	if ($hours !== 0) $res['uptime'] .= $hours."小时";
	$res['uptime'] .= $min."分钟";
	//MEMORY
	if (false === ($buf = get_key("hw.physmem"))) return false;
	$res['memTotal'] = round($buf/1024/1024, 2);

	$str = get_key("vm.vmtotal");
	preg_match_all("/\nVirtual Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buff, PREG_SET_ORDER);
	preg_match_all("/\nReal Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buf, PREG_SET_ORDER);

	$res['memRealUsed'] = round($buf[0][2]/1024, 2);
	$res['memCached'] = round($buff[0][2]/1024, 2);
	$res['memUsed'] = round($buf[0][1]/1024, 2) + $res['memCached'];
	$res['memFree'] = $res['memTotal'] - $res['memUsed'];
	$res['memPercent'] = (floatval($res['memTotal'])!=0)?round($res['memUsed']/$res['memTotal']*100,2):0;
	$res['memRealPercent'] = (floatval($res['memTotal'])!=0)?round($res['memRealUsed']/$res['memTotal']*100,2):0;

	return $res;
}

//取得参数值 FreeBSD
function get_key($keyName){
	return do_command('sysctl', "-n $keyName");
}

//确定执行文件位置 FreeBSD
function find_command($commandName){
	$path = array('/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin');
	foreach($path as $p){
		if (@is_executable("$p/$commandName")) return "$p/$commandName";
	}
	return false;
}
//执行系统命令 FreeBSD
function do_command($commandName, $args){
	$buffer = "";
	if (false === ($command = find_command($commandName))) return false;
	if ($fp = @popen("$command $args", 'r')) {
		while (!@feof($fp)) $buffer .= @fgets($fp, 4096);
		return trim($buffer);
	}
	return false;
}

//windows系统探测
function sys_windows(){
	if (PHP_VERSION >= 5){
		$objLocator = new COM("WbemScripting.SWbemLocator");
		$wmi = $objLocator->ConnectServer();
		$prop = $wmi->get("Win32_PnPEntity");
	}else{
		return false;
	}

	//CPU
	$cpuinfo = GetWMI($wmi,"Win32_Processor", array("Name","L2CacheSize","NumberOfCores"));
	$res['cpu']['num'] = $cpuinfo[0]['NumberOfCores'];
	if (null == $res['cpu']['num']) $res['cpu']['num'] = 1;
	/*
	for ($i=0;$i<$res['cpu']['num'];$i++){
		$res['cpu']['model'] .= $cpuinfo[0]['Name']."<br />";
		$res['cpu']['cache'] .= $cpuinfo[0]['L2CacheSize']."<br />";
	}*/
	$cpuinfo[0]['L2CacheSize'] = ' ('.$cpuinfo[0]['L2CacheSize'].')';
	if($res['cpu']['num']==1) $x1 = ''; else $x1 = ' ×'.$res['cpu']['num'];
	$res['cpu']['model'] = $cpuinfo[0]['Name'].$cpuinfo[0]['L2CacheSize'].$x1;
	// SYSINFO
	$sysinfo = GetWMI($wmi,"Win32_OperatingSystem", array('LastBootUpTime','TotalVisibleMemorySize','FreePhysicalMemory','Caption','CSDVersion','SerialNumber','InstallDate'));
	$sysinfo[0]['Caption']=iconv('GBK', 'UTF-8',$sysinfo[0]['Caption']);
	$sysinfo[0]['CSDVersion']=iconv('GBK', 'UTF-8',$sysinfo[0]['CSDVersion']);
	$res['win_n'] = $sysinfo[0]['Caption']." ".$sysinfo[0]['CSDVersion']." 序列号:{$sysinfo[0]['SerialNumber']} 于".date('Y年m月d日H:i:s',strtotime(substr($sysinfo[0]['InstallDate'],0,14)))."安装";
	//UPTIME
	$res['uptime'] = $sysinfo[0]['LastBootUpTime'];

	$sys_ticks = 3600*8 + time() - strtotime(substr($res['uptime'],0,14));
	$min = $sys_ticks / 60;
	$hours = $min / 60;
	$days = floor($hours / 24);
	$hours = floor($hours - ($days * 24));
	$min = floor($min - ($days * 60 * 24) - ($hours * 60));
	if ($days !== 0) $res['uptime'] = $days."天";
	if ($hours !== 0) $res['uptime'] .= $hours."小时";
	$res['uptime'] .= $min."分钟";

	//MEMORY
	$res['memTotal'] = round($sysinfo[0]['TotalVisibleMemorySize']/1024,2);
	$res['memFree'] = round($sysinfo[0]['FreePhysicalMemory']/1024,2);
	$res['memUsed'] = $res['memTotal']-$res['memFree'];	//上面两行已经除以1024,这行不用再除了
	$res['memPercent'] = round($res['memUsed'] / $res['memTotal']*100,2);

	$swapinfo = GetWMI($wmi,"Win32_PageFileUsage", array('AllocatedBaseSize','CurrentUsage'));

	// LoadPercentage
	$loadinfo = GetWMI($wmi,"Win32_Processor", array("LoadPercentage"));
	$res['loadAvg'] = $loadinfo[0]['LoadPercentage'];

	return $res;
}
function GetWMI($wmi,$strClass, $strValue = array()){
	$arrData = array();

	$objWEBM = $wmi->Get($strClass);
	$arrProp = $objWEBM->Properties_;
	$arrWEBMCol = $objWEBM->Instances_();
	foreach($arrWEBMCol as $objItem){
		@reset($arrProp);
		$arrInstance = array();
		foreach($arrProp as $propItem){
			eval("\$value = \$objItem->" . $propItem->Name . ";");
			if (empty($strValue)){
				$arrInstance[$propItem->Name] = trim($value);
			}else{
				if (in_array($propItem->Name, $strValue)) $arrInstance[$propItem->Name] = trim($value);
			}
		}
		$arrData[] = $arrInstance;
	}
	return $arrData;
}
?>